import { RoleCamp, RoleType, LayerEnum } from "./IEnum";
import { IDictionary } from "./IUtils";
import { ISkillBase } from "./ISkill";

/**
 * 元素根接口
 * TIPS：继承接口则可以添加至场景
 *      元素具备基本更新及销毁功能。
 */
export interface IElmentRoot {
    /**角色编号 */
    no: number;
    /**是否已死亡*/
    isDead: boolean;
    /**角色所在层级 */
    layer: LayerEnum;
    /**基础元素 */
    spriteBase: any;
    /**
     * 摧毁角色
     * @param dispose 释放强行释放资源-不执行其它操作
     */
    destroy(dispose?: boolean);
    /**更新角色 */
    update();
}
/**
     * 角色基类接口 
     * TIPS: 角色阵营，名称等属性
     * */
export interface IRoleBase {
    roleName: string;
    roleType: RoleType;
    roleCamp: RoleCamp;
    /**是否角色类型相同 */
    isRoleType(type: RoleType): boolean;
    /**是否阵营相同 */
    isRoleCamp(camp: RoleCamp): boolean;
}

/**角色属性基类接口 
 * xxx: type 尽量使用枚举类型
*/
export interface IRoleProperty {
    /**获取属性 */
    getAttr(type: number): number;
    /**改变属性值 */
    changeProperty(type: number, delta: number);
    /**设置属性值 */
    setAttr(type: number, value: number);
    /**清空所有属性及值 */
    clear();
    /**重置属性值为0 */
    reset();
}
/**
 * 角色属性扩展接口 实现
 * xxx: type 尽量使用枚举类型
 */
export interface IRolePropertyExtend {
    /**基础属性 */
    baseProperty: IRoleProperty;
    /**动态属性 */
    deltaProperty: IRoleProperty;

    /**获取基础属性 */
    getBaseValue(type: number): number;
    /**设置基础属性值 */
    setBaseValue(type: number, val: number);
    /**获取总属性-动态属性加基础属性 */
    getDeltaValue(type: number): number;
    /**
     * 改变属性值
     * TIPS:可监听属性值，如血量为0则 判定角色死亡。
     */
    changeProperty(type: number, val: number);
    /**重置属性 */
    reset();
}
/** 角色动作接口 */
export interface IRoleAction {

}
/**角色控制 */
export interface IRoleControl {
    /**
     * 是否死亡
     */
    isDead(): boolean;
    /**
     * 受到攻击触发
     * @param skill 技能接口
     */
    onAttacked(skill: ISkillBase);
}
/**角色生成器 */
export interface IRoleGenerator {
    /**创建角色  */
    create(id: number, camp: RoleCamp, roleParam: RoleCamp, roleNo: number): IElmentRoot;
}

/**
 * 角色管理器
 * TIPS: 管理所有角色
 */
export interface IRoleManager {
    /**角色容器 */
    container: IDictionary<number, IElmentRoot>;
    /**注册角色生成器 */
    regisertCreate(roleType: RoleType, roleGenerator: IRoleGenerator);
    /**创建角色  */
    create(id: number, roleType: RoleType, camp: RoleCamp, roleParam: RoleCamp, roleNo: number): IElmentRoot;
    /**添加角色 */
    add(role: IElmentRoot);
    /**移除角色 */
    remove(role: IElmentRoot);
    /**移除角色 通过唯一序号 */
    removeById(no: number);
    /**获取角色 通过角色唯一序号 */
    getRoleById(no: number): IElmentRoot;
    update();
}
/**
 * 移动算法接口
 */
export interface IMoveAlgorithm {
    /**移动速度 */
     speed:number;
     /**力向量 */
     vector: IVector;
    /**
     * 设置参数
     * @param element 移动对象
     * @param option 移动属性-自定义
     */
    setOptions(element: IElmentRoot, option: any);
    /**参数更新 */
    updateOptions(option: any);
    /**获取物理引擎向量参数 */
    getPyhicsVector():IVector;
    /**移动 */
    move();
    /**是否启用移动算法-默认为true */
    enable(isEnable:boolean);
}
 

/**坐标点 */
export interface IPoint {
    x: number;
    y: number;
}

/**向量力 */
export interface IVector {
    x: number;
    y: number;
}
/**举行区域 */
export interface IRectangle {
    x: number;
    y: number;
    w: number;
    h: number;
}

/**举行区域 */
export interface ICircle {
    x: number;
    y: number;
    /**半径 */
    r: number;
}